非 Control Tower 環境で 許可された AMI の declarative policies(宣言型ポリシー)の適用をやってみた

非 Control Tower 環境で 許可された AMI の declarative policies(宣言型ポリシー)の適用をやってみた

Clock Icon2025.01.07

カスタマーサクセス部 運用支援チームのいたくらです。

はじめに

先月、Amazon EC2 で AMI ガバナンスを強化するために 許可された AMI が導入されたというアップデートブログを公開しました。
その際は特定アカウント上でのみ、許可された AMI の設定を有効にしていました。
https://dev.classmethod.jp/articles/202412-allowed-amis/

今回は、宣言型ポリシーを使用して、Organizations 内の一部 OU で許可された AMI の設定を有効にしてみました。

検証環境について

参考として、検証環境について補足します。

  • AWS Organizations を有効化済みで、以下の OU 構成
    • 3.png
    • SandboxOU 配下には itkr_mem02(以降、アカウントA と表記)と itkr_mem03(以降、アカウントB と表記)が存在
  • AWS Control Tower は有効化していない
  • アカウントA、アカウントB それぞれで自己所有 AMI を作成済みで、それぞれ組織での共有を設定済み

やってみた

以下の公式ブログと公式ドキュメントを参考に実施しました。

宣言型ポリシーを有効化する

ポリシーを作成して組織にアタッチする前にまずはポリシータイプを有効にする必要があります。
AWS Organizations のサービスページに移動し、「ポリシー」>「EC2 の宣言型ポリシー」の順にクリックします。
1-2.png

「EC2 の宣言型ポリシーを有効にする」をクリックします。
4.png

有効になったら以下のような表示が出ます。
5.png

宣言型ポリシーのアカウントステータスレポートを生成する

宣言型ポリシーを作成する前に宣言型ポリシーの機能「アカウントステータスレポート」を使用して、AWS 環境の現在のステータスを把握します。

まずアカウントステータスレポートを出力する S3 バケットを us-east-1(バージニア北部)で作成します。
Amazon S3 のサービスページに移動して、S3 バケットを作成し、作成したバケットに以下のバケットポリシーをアタッチします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DeclarativePoliciesReportBucket",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "report.declarative-policies-ec2.amazonaws.com"
                ]
            },
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::<bucketName>/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": "arn:<partition>:declarative-policies-ec2:<region>:<accountId>:*"
                }
            }
        }
    ]
}

S3 バケットの準備は以上です。続けてアカウントステータスレポートの生成に移ります。

AWS Organizations のサービスページより、「ポリシー」>「EC2 の宣言型ポリシー」>「アクション」>「アカウントステータスレポートを表示」>「ステータスレポートを生成」の順にクリックします。
6.png
7.png

先ほど作成した S3 バケットと、レポート範囲に含めるアカウントまたは OU を指定して、「送信」をクリックします。
今回は SandboxOU に宣言型ポリシーを適用する想定なので、SandboxOU を指定しています。
8-2.png

アカウントステータスレポートの生成には時間がかかるので、少し待ちます(以下は待機画面です)。
9.png

レポート生成が終わると、以下のような表示になります。
10-1.png

アカウント毎の詳細なレポートを確認したい場合は、S3 バケットからダウンロードすれば確認可能です。
11.png

今回は全項目で「アカウント全体で統一」が「Yes」という評価になっていましたが、統一できていない場合は「No」と評価されるため、「No」と評価された項目に紐づいた宣言型ポリシーを作成することで、必要なポリシーを効率良く適用できるようになっていそうだなと感じました。

宣言型ポリシーを作成する

実際に宣言型ポリシーを作成します。
今回は許可された AMI の宣言型ポリシーを作成します。

AWS Organizations のサービスページより、「ポリシー」>「EC2 の宣言型ポリシー」>「ポリシーを作成」の順にクリックします。
12.png

ポリシー名、ポリシーの説明、サービス属性を入力/選択します。
13.png

「許可されている画像設定」を選択すると、無効 / 有効 / 監査モード のいずれかを選べるようになるので、今回は「監査モード」を選択しました。
また、AMI 基準については、AWS によって作成された AMI / AWS Marketplace で検証済みのプロバイダーによって作成された AMI / アカウントA で作成されたAMI は許可するという設定にしました。
14.png

試しにカスタムエラーメッセージを設定して、最後に「ポリシーを作成」をクリックします。
※日本語で設定したらエラーが出たので、英語で設定しましょう
15.png

作成が完了すると利用可能なポリシー一覧に表示されます。
16.png

宣言型ポリシーをアタッチする

作成した宣言型ポリシーを SandboxOU にアタッチします。
17.png
18.png

正常にアタッチされると「ターゲット」タブにアタッチした SandboxOU が表示されました。
19.png

宣言型ポリシーが反映されたことを確認する

宣言型ポリシーを SandboxOU にアタッチできたので、反映されたことを確認します。

SandboxOU 配下にある アカウント A で AMI を確認します。
20.png

アカウント B で作成された AMI (AMI 名:test-ami-20250106-actB)は「Allowed image」列が「いいえ」となっています。
宣言型ポリシーでAWS によって作成された AMI / AWS Marketplace で検証済みのプロバイダーによって作成された AMI / アカウントA で作成されたAMI は許可するという設定にしたので、反映されていますね。

管理アカウント上で許可された AMI 設定を「監査モード」から「有効」へ変更して、再びアカウント A で AMI を確認してみました。
22.png
基準を満たしていない(アカウント B が作成した)AMI については一覧に表示されなくなり、変更が反映されたことが確認できました。

また、宣言型ポリシーをアタッチした SandboxOU の詳細画面でも、許可された AMI の宣言型ポリシーが反映されていることが確認できました。
23.png

少しハマったこと

当初、アカウントステータスレポート出力用の S3 バケットを「東京リージョン」で作成していました。
ですが、アカウントステータスレポートの生成で「送信」をクリックしたら、以下のエラーが出ました。
error.png
「account-status-report-bucket-xxxxxxxxxxxx バケットに書き込めません。バケットが存在し、正しいリージョンにあり、呼び出し元のアカウントによって所有されており、バケットポリシーが正しいことを確認してください。」という内容でした。

バケット設定を見直したところ問題なさそうだったので、正しいリージョンって何だ?と思い公式ドキュメントを見直したところ「リクエストが行われたリージョンと同じリージョンに存在し、適切な S3 バケットポリシーを持っている必要がある」という記載がありました。
Organizations はグローバルサービスだから、リクエストが行われているリージョンはバージニア北部ってことか!と後から気付き、バージニア北部リージョンでバケットを作成し直して、再度アカウントステータスレポートの生成を試みたら成功しました。

ついつい東京リージョンで作ってしまうので、気を付けないといけないなと思いました。

さいごに

宣言型ポリシーは API レベルではなくサービスレベルで直接適用されるため、導入後の管理コストが抑えられるというメリットがあります。
使えるものは積極的に使っていきたいなと思いました。

また、カスタムエラーメッセージを確認してみたいと思ったのですが、下記の理由で確認できませんでした。

  • 監査モードの場合、非準拠 AMI でもインスタンス起動可能なため、エラーメッセージは確認できない
  • 有効の場合、そもそも AMI 一覧に表示されなくなるため起動不可能
    • AWS CLI でインスタンス起動を試みてみたが、An error occurred (InvalidAMIID.NotFound) when calling the RunInstances operation: The image id '[ami-041603a16xxxxxxxx]' does not exist というエラーメッセージになってしまい、カスタムエラーメッセージを確認できない

他の宣言型ポリシーだとカスタムエラーメッセージを表示する場がありますが、許可された AMI の宣言型ポリシーのカスタムエラーメッセージについては、表示する場が無いのかも…?と思いました。

この記事がどなたかのお役に立てれば幸いです。

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。
サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.